// JavaScript Document

// 全局表单验证插件(同时支持form和ajax)///////////////////////////////////////////
// 完善验证规则和模式
(function($){
	$.fn.submitForm = function(options){
		var defaults = {
			ajax : false, // Boolean 是否启用ajax方式提交数据, 默认false
			context : null, // PlainObject 回调函数的上下文对象 默认:null
			dataType : "json", // String 服务器返回的数据类型  取值：text/xml/json/jsonp/script/html
			data : null, // 类型: PlainObject/string 发送到服务器的数据 默认：null
			timeout : 10000, // Number  请求超时时间 毫秒
			async : true, // Boolean 是否异步 true-异步 / false - 同步  默认：true
			cache : false, // Boolean 是否缓存 true/false 默认：false
			crossDomain : false, // Boolean 是否跨域请求 默认: false
			ifModified : false, // Boolean 默认为false，仅在服务器数据改变时获取数据
			traditional : false, // Boolean 默认false , 是否用传统的方式来序列化数据。
			
			// 表单验证出错执行函数
			validError : function(msg){
				$.messageDialog.open({message : msg});  // 默认封装弹出提示
			},
			// ajax开始前执行函数
			ajaxStart : function(){
				// 打开数据处理进度面板
				$.progressDialog.open({message:"数据处理中，请稍后..."});
			},
			// ajax成功执行函数
			ajaxSuccess : function(json){}, 
			// ajax失败执行函数
			ajaxError : function(){
				// 打开错误提示面板
				$.alertDialog.open({message:"数据提交失败，请检查网络！"});
			}, 
			// ajax完成执行函数
			ajaxComplete : function(){
				// 关闭数据处理进度面板
				$.progressDialog.close();
			}
		};
		
		// 通用验证 检测 开始 ////////////////////////////////
		
		function validClient(objForm){
			
			  var isValid = true;
			  
			  // input type="text"| type="password", select
			  $("[required]",objForm).each(function(){
				  
					  // pattern
					  if(Boolean($(this).attr("pattern"))){
						  
						  isValid = false;
						  
						  if(Boolean($(this).val().match(new RegExp($(this).attr("pattern"))))){
							  
							  isValid = true;
							  
						  }else{
							  
							  isValid = false;
						  
							  if(Boolean($(this).attr("errormessage"))){
								  newOptions.validError($(this).attr("errormessage"));
							  };
							  
							  return false;
								  
						  };
						  
					  }else{
						  isValid = true;
					  };
					  
					  // compare
					  if(Boolean($(this).attr("comparetarget"))){
						  
						  isValid = false;
						  
						  if($(this).val() == $("#" + $(this).attr("comparetarget")).val()){
							  
							  isValid = true;
							  
						  }else{
							  
							  isValid = false;
						  
							  if(Boolean($(this).attr("errormessage"))){
								  newOptions.validError($(this).attr("errormessage"));
							  };
							  
							  return false;
							  
						  };
						  
					  }else{
						  isValid = true;
					  };
				  
			  });
			  
			  return isValid;
			
		};
		
		// 通用验证 检测 结束 ////////////////////////////////
		
		var newOptions = $.extend(true,{},defaults,options);
		return this.each(function(){
			
			var obj = $(this),objSubmit = null,objForm = null;
			
			// 判断绑定形式 input:submit / form
			if(obj.is("form")){
				
				objSubmit = $(":submit",obj);
				objForm = obj;
				
			}else if(obj.is(":submit")){
				
				objSubmit = obj;
				
				if(obj.attr("form") == undefined){
					
					objForm = obj.parents("form");
					
				}else{
					
					objForm = $("#" + obj.attr("form"));
					
				};
				
			};
			
			// 判断是否通过验证并提交
			objSubmit.click(function(event){
				
				event.preventDefault();
				// 判断是否通过验证
				if(validClient(objForm)){
					
					if(newOptions.ajax){

						// ajax提交
						$.ajax({context:objForm,
						url:objForm.attr("action"),
						data:objForm.serializeArray(),
						type:objForm.attr("method"),
						timeout:newOptions.timeout,
						dataType:newOptions.dataType,
						async:newOptions.async,
						cache:newOptions.cache,
						beforeSend:newOptions.ajaxStart,
						success:newOptions.ajaxSuccess,
						error:newOptions.ajaxError,
						complete:newOptions.ajaxComplete});
						
					}else{
						
						objForm.submit(); // form 提交
						
					};
					
				};
				
			});
			
		});
	};
})(jQuery);

// 事件绑定通用规则 /////////////////////////////////////////////////////



// 滑动加载 /////////////////////////////////////////////////////

// 补充：loadSuccess : function(){}  /// 滑动加载成功要执行的函数
//  比如： 新增项目 需要添加的特效
//  数据模版问题
// 流式瀑布加载模型中等高和非等高问题

// 滑动分页加载 /////////////////////////////////////////////////////////////
(function($){
	$.fn.effectPaging = function(options){
		var defaults = {
			scrollHolder : window, // scroll 容器
			pageMode : "links", // 分页模式 : links-超链接分页加载, ajax-滑动分页加载, 
			currentPageNum : 1, // 当前页码
			totalPageNum: null, // 分页数
			pageUrl: function (pageNum) {
			    return null;
			   // 分页连接模式 如：
			   // return "article-list.html?pn=" + pageNum;
			   // 取得分页内容的ajax连接模式 如：
			   // return "json.txt?pn=" + pageNum;
			},
			ajaxTimeout : 10000, // ajax 提交最大时间
			ajaxType : "GET", // POST 或 GET 
			ajaxDataType : "json", // 数据类型
			ajaxAsync : true, // 是否异步 true--异步，false-同步
			ajaxCache : false, // 是否缓存数据 true-缓存, false-不缓存
			// ajax成功执行函数
			ajaxSuccess : function(json){}
		};
		
		var newOptions = $.extend(true,{},defaults,options);
		return this.each(function(){
			
		    // 取得当前控件
		    var obj = $(this);

		    // 判断分页模式
		    if (newOptions.pageMode == "links") {

		        // 传统分页模式
		        var html = "<div id='paging' class='paging' style='display:none;'><a href='#' class='link'>上一页</a><select><options value='1'>第1页</option></select><a href='#' class='link'>下一页</a></div>";
		        obj.parent().append(html);

		        //取得分页控件
		        var objPaging = $("#paging");

		        // 取得上一页面 下一页连接
		        var objLink = objPaging.find("a");
		        var objPrevLink = objLink.eq(0);
		        var objNextLink = objLink.eq(1);

		        // 取得select分页控件
		        var objSltLink = objPaging.find("select");

		        // 部署上下页连接
		        if (newOptions.currentPageNum == 1 && newOptions.totalPageNum == 1) {
		            objPrevLink.attr("href", "javascript:void(0);");
		            objNextLink.attr("href", "javascript:void(0);");
		        } else if (newOptions.currentPageNum == 1) {
		            objPrevLink.attr("href", "javascript:void(0);");
		            objNextLink.attr("href", newOptions.pageUrl(newOptions.currentPageNum + 1));
		        } else if (newOptions.currentPageNum == newOptions.totalPageNum) {
		            objPrevLink.attr("href", newOptions.pageUrl(newOptions.currentPageNum - 1));
		            objNextLink.attr("href", "javascript:void(0);");
		        } else {
		            objPrevLink.attr("href", newOptions.pageUrl(newOptions.currentPageNum - 1));
		            objNextLink.attr("href", newOptions.pageUrl(newOptions.currentPageNum + 1));
		        };

		        // 部署select分页连接
		        objSltLink.empty();

		        for (var i = 1; i <= newOptions.totalPageNum; i++) {
		            objSltLink.append("<option value='" + i + "'>第" + i + "页</option>");
		        };

		        objSltLink.val(newOptions.currentPageNum); // 设置当前页面为选中

		        objSltLink.change(function (e) {

		            window.location.href = newOptions.pageUrl($(this).val());

		        });

		        // 显示分页控件
		        objPaging.show();

		    } else {

		        // Ajax分页模式
		        var html = "<div id='paging' class='paging' style='display:none;'><a href='javascript:void(0);'>正在获取更多...</a><a href='#'>加载失败，请点击重新加载</a><a href='javascript:void(0);'>已显示全部内容</a></div>";
		        obj.parent().append(html);

		        //取得分页控件
		        var objPaging = $("#paging");

		        // 取得滑动加载提示
		        var objSlip = objPaging.find("a");
		        var objSlipLoadData = objSlip.eq(0);
		        var objSlipLoadError = objSlip.eq(1);
		        var objSlipLoadComplete = objSlip.eq(2);

		        objPaging.data("status", 0);

		        // 初始判断
		        if (newOptions.totalPageNum) {
		            // 判断数据加载状态
		            // 0 - 未加载/加载成功, 1 -加载中, 2 - 分页内容全部加载完, 3 -- 加载失败
		            if (newOptions.currentPageNum < newOptions.totalPageNum) {
		                objPaging.data("status", 0);
		            } else {
		                objPaging.data("status", 2);
		            };
		        };
				
				// 滑动加载函数
				function loadAjaxData(){
					
					// ajax获取数据
					$.ajax({url:newOptions.pageUrl(newOptions.currentPageNum + 1),type:newOptions.ajaxType,timeout:newOptions.ajaxTimeout,dataType:newOptions.ajaxDataType,async:newOptions.ajaxAsync,cache:newOptions.ajaxCache,beforeSend:function(){
						
						   objPaging.data("status",1);
						   
						   objSlip.hide();
						   objSlipLoadData.show();
						   objPaging.show(); // 显示加载面板
						   
						},success:function(json){
							
							objPaging.data("status",0);
							
							if(typeof(newOptions.ajaxSuccess) == "function"){newOptions.ajaxSuccess(json);};
							
							newOptions.currentPageNum += 1;
							
							if(newOptions.totalPageNum){
								
								if(newOptions.currentPageNum < newOptions.totalPageNum){
								
								   objPaging.data("status",0);
								   
								   objSlip.hide();
								   objSlipLoadData.show();
								   objPaging.show(); // 隐藏加载面板
									
								}else{
									
								   objPaging.data("status",2);
								   
								   objSlip.hide();
								   objSlipLoadComplete.show();
								   objPaging.show(); // 显示加载面板
								};
								
							};
							
						},error:function(){
							
							objPaging.data("status",3);
							
							objSlip.hide();
							objSlipLoadError.show();
							objPaging.show(); // 显示加载面
							
						}});
					
				};
				
				// 滑动加载失败点击加载
				objSlipLoadError.click(function(e){
					
					e.preventDefault();
					
					objSlip.hide();
					objSlipLoadData.show();
					objPaging.show();
					
					loadAjaxData();
					
				});
				
				// 滑动事件
				$(newOptions.scrollHolder).scroll(function(e){
					
					// 未加载/加载成功
					if(objPaging.data("status") == 0){
						
						/////////////////////////////////////////////////////////////////
						
						var scrollTop = $(this).scrollTop(); // 滑动条距离顶部的高度
						var scrollHeight = $(document).height(); // 当前页面的总高度
						var winHeight = $(window).height();  // 当前可视的页面高度
						
						// window.location.hash = scrollTop + winHeight + " | " + scrollHeight;
						
						// 检查是否执行滑动分页
						if (scrollTop + winHeight >= scrollHeight) {
							loadAjaxData();
						};
						
						/////////////////////////////////////////////////////////////////
						
					}else if(objPaging.data("status") == 1){
						
						// 数据加载中
						objSlip.hide();
						objSlipLoadData.show();
						objPaging.show(); // 显示加载面板
							
					}else if(objPaging.data("status") == 2){
						
						// 内容全部加载完成
						objSlip.hide();
						objSlipLoadComplete.show();
						objPaging.show();
						
					}else if(objPaging.data("status") == 3){
						
						// 加载失败
						objSlip.hide();
						objSlipLoadError.show();
						objPaging.show();
						
					};
					
				});
				
			};
			
		});
	};
})(jQuery);